/********************************************************************************
 * @file    main.c
 * @brief   主函数
 * 
 * @author  nzttj
 * @date    2025-02-13
 * @version 1.0
 * 
 * Copyright (C) 2025 nzttj
 * 
 * 本软件使用 GNU 通用公共许可证 (GPL) 第 3 版授权。
 * 
 * 您可以自由使用、修改、分发本软件，但必须遵守以下条件：
 * 1. 源代码必须开放，且您修改后的代码也必须以 GPL 许可证发布。
 * 2. 发布或分发本软件时，必须附带本许可证，并提供源代码或获取源代码的方式。
 * 
 * 本软件按“原样”提供，不附带任何担保，使用风险由用户自行承担。
 * 
 ********************************************************************************/

#include <stdio.h>
#include <time.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_err.h"
#include "nvs_flash.h"
#include "esp_netif.h"
#include "esp_event.h"
#include "esp_log.h"

#include "bl0942.h"
#include "app_wifi.h"
#include "app_nvs.h"
#include "app_iot_ctrl.h"
#include "cn8023a.h"
#include "app_tcp_server.h"
#include "app_energy_storage.h"
#include "hal_sntp.h"
#include "smart_timer.h"

#define MAX_TIMERS (16)

static const char *TAG = "main";

static void s_timer_callback(uint8_t timer_id, timer_action_t action, void *user_data)
{
    iot_ctrl_t iot_ctrl = {.type = IOT_CTRL_TYPE_CN8023A, .value = 0};

    ESP_LOGI(TAG, "Timer %d triggered with action %d", timer_id, action);

    switch (action)
    {
        case TIMER_ACTION_ON:
            iot_ctrl.value = 1;
            break;
        case TIMER_ACTION_OFF:
            iot_ctrl.value = 0;
            break;
        default:
            return;
    }

    app_iot_ctrl_with_queue(&iot_ctrl);
}

static void s_sntp_sync_cb(struct timeval *tv)
{
    // 初始化智能定时器
    smart_timer_init(MAX_TIMERS);
    // 注册回调
    smart_timer_register_callback(s_timer_callback, NULL);
}

void app_main()
{
    printf("##################################################\r\n");
    printf("built time: %s %s, version: %s\r\n", __DATE__, __TIME__, PROJECT_VER);
    printf("commit id: %s\r\n", APP_COMMIT_ID);
    printf("##################################################\r\n");

    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);

    esp_netif_init();
    esp_event_loop_create_default();

    // 设置时区
    setenv("TZ", "CST-8", 1);
    tzset();
    // 初始化SNTP
    hal_sntp_add_server(0, "ntp1.aliyun.com");  //阿里云NTP服务器
    hal_sntp_add_server(1, "cn.pool.ntp.org");  //国家授时中心
    hal_sntp_add_server(2, "time.windows.com"); //Windows默认NTP服务器
    hal_sntp_set_sync_callback(s_sntp_sync_cb);   //设置NTP同步回调
    hal_sntp_init();
    // 初始化能量存储
    app_energy_storage_init();
    // 初始化 TCP 日志
    app_tcp_log_init();
    // 加载所有配置
    app_nvs_load_all_cfg();
    // 初始化CN8023A
    cn8023a_init();
    // 初始化IoT控制模块
    app_iot_ctrl_init();
    // 初始化 bl0942
    bl0942_data_callback_register(app_energy_storage_process);
    bl0942_init();
    // 初始化 Wi-Fi
    app_wifi_init();
}
